package com.yuanqi.service;

import com.yuanqi.domain.RetailReturnOrder;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 零售退货订单服务接口
 */
public interface RetailReturnOrderService {
    
    /**
     * 创建退货订单
     */
    RetailReturnOrder createReturnOrder(RetailReturnOrder returnOrder);
    
    /**
     * 更新退货订单
     */
    RetailReturnOrder updateReturnOrder(RetailReturnOrder returnOrder);
    
    /**
     * 根据ID查找退货订单
     */
    Optional<RetailReturnOrder> findById(Long id);
    
    /**
     * 根据退货单编码查找退货订单
     */
    Optional<RetailReturnOrder> findByReturnCode(String returnCode);
    
    /**
     * 查找所有退货订单
     */
    List<RetailReturnOrder> findAll();
    
    /**
     * 分页查找退货订单
     */
    Page<RetailReturnOrder> findAll(Pageable pageable);
    
    /**
     * 根据原订单ID查找退货订单
     */
    List<RetailReturnOrder> findByOriginalOrderId(Long originalOrderId);
    
    /**
     * 根据原订单编码查找退货订单
     */
    List<RetailReturnOrder> findByOriginalOrderCode(String originalOrderCode);
    
    /**
     * 根据客户ID查找退货订单
     */
    List<RetailReturnOrder> findByCustomerId(Long customerId);
    
    /**
     * 根据客户姓名查找退货订单
     */
    List<RetailReturnOrder> findByCustomerName(String customerName);
    
    /**
     * 根据客户电话查找退货订单
     */
    List<RetailReturnOrder> findByCustomerPhone(String customerPhone);
    
    /**
     * 根据退货状态查找退货订单
     */
    List<RetailReturnOrder> findByReturnStatus(String returnStatus);
    
    /**
     * 根据日期范围查找退货订单
     */
    List<RetailReturnOrder> findByReturnDateBetween(LocalDateTime startDate, LocalDateTime endDate);
    
    /**
     * 审核退货订单
     */
    RetailReturnOrder approveReturnOrder(Long returnOrderId, String approverName, String remark);
    
    /**
     * 拒绝退货订单
     */
    RetailReturnOrder rejectReturnOrder(Long returnOrderId, String reason, String approverName);
    
    /**
     * 处理退货订单
     */
    RetailReturnOrder processReturnOrder(Long returnOrderId, String processorName);
    
    /**
     * 完成退货订单
     */
    RetailReturnOrder completeReturnOrder(Long returnOrderId, String processorName);
    
    /**
     * 更新退货状态
     */
    RetailReturnOrder updateReturnStatus(Long returnOrderId, String status, String operatorName);
    
    /**
     * 删除退货订单
     */
    void deleteById(Long id);
    
    /**
     * 获取退货统计信息
     */
    Object getReturnStatistics();
    
    /**
     * 生成退货单编码
     */
    String generateReturnCode();
}
